package com.sykj.why.mongo.dao;

import com.mongodb.DBObject;
import com.sykj.why.mongo.document.BaseDocument;
import com.sykj.why.mongo.dto.PageDTO;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.query.Query;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 基本数据交互层，此处记录了一些对数据库操作的基础方法
 *
 * @author Arvin.Cao
 */
public interface BasicDao<T extends BaseDocument> {
    // 保存
    void save(T entity);

    void save(List<T> list);

    // 更新或者保存
    void saveOrupdate(T entity);

    // 删除，逻辑删除
    void remove(T entity);

    // 根据ID删除，物理删除
    boolean delete(T entity);

    /**
     * 启用或者禁用
     * @param entity 实体
     * @param flag 启用还是禁用 true为启用，false 为禁用
     */
    void disableOrEnable(T entity, boolean flag);

    // 查找全部
    @SuppressWarnings("rawtypes")
    List<T> findAll(Class cls);

    /**
     * 根据单个字段查询所有
     *
     * @param name
     * @param t
     * @param removed
     * @return
     */
    List<T> findAll(String name, String val, Class<T> t, boolean removed);

    /**
     * 根据多个字段查询所有
     *
     * @param query
     * @param t
     * @param removed
     * @return
     */
//     List<T> findAll(Map<String, Object> query, Class<T> t, boolean removed);

    /**
     * 根据条件查询所有数据
     *
     * @param query
     * @param t
     * @return
     */
    List<T> findAll(Query query, Class<T> t);

    /**
     * 去重复查询
     *
     * @param collection
     * @param key
     * @return
     */
    List<T> findDistinctAll(String collection, String key);

    /**
     * 去重复查询
     *
     * @param collection
     * @param key
     * @return
     */
    List<T> findDistinctAll(String collection, String key, DBObject query);

    /**
     * 根据删除标记获取所有数据
     *
     * @param t
     * @param removed
     * @return
     */
    List<T> findAll(Class<T> t, boolean removed);

    int getPageSize(long totalCount, int lineSize);

    /**
     * 根据条件分页查询所有数据
     *
     * @param query
     * @param t
     * @return
     */
    List<T> findByPage(Query query, int currentPage, int lineSize, Class<T> t);

    /**
     * 根据条件分页查询所有数据
     * @param query query自定的条件
     * @param page paegDTO
     * @param t
     * @Desc  根据前端传入的数据
     * @return
     */
    List<T> findByPage(Query query, PageDTO page, Class<T> t);

    // 根据ID查找
    @SuppressWarnings("rawtypes")
    T get(Class cls, String id, boolean removed);

    // 根据ID查找
    @SuppressWarnings("rawtypes")
    T get(Class cls, String id);

    // 一个参数得到相应信息
    @SuppressWarnings("rawtypes")
    T get(String fieldName, Object getValue, Class cls, boolean removed);

    // 两个个参数得到相应信息
    @SuppressWarnings("rawtypes")
    T get(String fieldNameOne, Object getValueOne, String fieldNameTwo, Object getValueTwo, Class cls, boolean removed);

    T findOne(Query query, Class<T> t);

    // 修改
    @SuppressWarnings("rawtypes")
    boolean update(String fieldName, Object updatevalue, String id, Class entity);

    // 修改全部
    @SuppressWarnings("rawtypes")
    boolean updateAll(String fieldName, Object updatevalue, String updateId, String id, Class entity);

    // 根据removed 查询总数
    long count(Class<T> c, boolean removed);

    // 查询数据的总数
    @SuppressWarnings("rawtypes")
    long count(String fieldName, Object selRemoved, Class entity);

    // 查询数据的总数
    @SuppressWarnings("rawtypes")
    long count(String fieldName, Object selRemoved, boolean removed, Class entity);

    // 查询数据的总数
    @SuppressWarnings("rawtypes")
    long count(String fieldNameOne, Object selRemovedOne, String fieldNameTwo, Object selRemovedTwo, boolean removed, Class entity);

    //根据条件查询所有的记录的总数
    long count(Query query, Class<T> entity);

    // 聚合查询
    AggregationResults<T> aggregate(Aggregation aggregation, String collectionName, Class<T> entity);

}
